import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPServer {

    // 定义一个socket对象
    // 通过网络通信 , 必须使用socket对象
     private DatagramSocket socket = null;
     // 绑定端口有些情况可能会失败(例如端口号被占用) , 此时这里绑定出错
     // 同一台主机的端口同一时刻只能被一个进程绑定
     public UDPServer(int port) throws SocketException {
         // 构造socket的时候绑定端口
         socket = new DatagramSocket(port);
     }

     // 启动服务器的主逻辑
    public void start() throws IOException {
        System.out.println("服务器启动");

        // 服务器时刻准备为客户端提供服务
        while (true) {
            // 1.读取请求并解析
            //    创建空饭盒
            DatagramPacket requestPacket =
                    new DatagramPacket(new byte[4096],4096);
            //    打饭 --- 从网卡读取数据
            socket.receive(requestPacket);
            //    为了方便处理,将请求处理为string , 此处操作并非是必须的,只是为了后续代码简单
            String request =
                    new String(requestPacket.getData(),0, requestPacket.getLength());
            // 2.根据请求计算响应
            String response = process(request);

            // 3.把响应结果写回到客户端
            //     根据response创建数据报
            //     和请求packet不同,此处构造响应的时候,需要指定这个包要发给谁
            DatagramPacket responsePacket =
                    new DatagramPacket(response.getBytes(),response.getBytes().length,
                            // requestPacket此处的方法会得到客户端的ip和端口
                            requestPacket.getSocketAddress());
            socket.send(responsePacket);
            System.out.printf("[%s %d]  req %s resp %s\n",
                    requestPacket.getAddress().toString(),// ip
                    requestPacket.getPort(), // 客户端端口
                    request, response);


        }
    }

    // 根据请求计算响应 --- 回显服务器直接返回请求就好
    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UDPServer udpServer = new UDPServer(9090);
        udpServer.start();
    }
//    public void start1 () throws IOException {
//
//         DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
//         socket.receive(requestPacket);
//         String request = new String(requestPacket.getData().0,requestPacket.getLength());
//    }


}
